# 120公里每小时与齿轮 ## 细节 我能轻松地将车开到120公里每小时,可我几乎不能看到齿轮是如何切换衔接的,就连前机舱盖都很少打开。 有的人看到日志立刻就能知道异常的来源从而定位失败的原因,有的人看到日志就能在脑子里复现代码的运行走向,有的人根据程序呈现的现象就能预测将会出现的情况。深入理解程序的设计,了解程序的编写规范,掌握设计的实现,对于技术的拓展和理解有着很大的帮助,因此,学习源码对于技术的成长有着很大的促进作用。 近来发现自己的语言组织能力变差了,借此机会进行文档的输出,也顺带练习提高自己的语言组织能力,不至于在该说话时结结巴巴,不知如何表达。 ## 经历 从开始正式进入大数据行业工作到现在已经刚好四年,四年时间,大学生都可以毕业了。刚开始从最基础的Hadoop平台开始接触,编写一些shell脚本进行任务调度,到后来进行ETL工作,理解Hive使用Hive SQL,接着使用SparkSQL,对分布式的大数据处理有了深切的感受,批次加工还不够及时,再到Flink程序的编写,任务的提交,以及在生产环境中实际上线实时应用,这一路走来,不说学习到很多知识,里面趟到的浑水也不少,经验攒了也挺多。SQL已经成为一项基本功,为了深度定制复杂的数据处理,还需要使用Java操作Spark、Flink的API。由于水平不同、对于业务的理解也不同,不同的开发总是能写出来不一样的代码,有的代码像诗一样错落有致、简洁优雅,而有的,都不愿意再打开第二次。我尽力保持自己代码的易读性,简洁性,至少,我想让看到我代码的人,不至于犯恶心,愿意打开第二次(除非业务特别复杂难以实现)。以上种种,接触过Hadoop、Spark、Hive、Flink,批次离线加工主要使用Spark,实时处理主要使用Flink,存储上接触过Starrocks、Clickhouse、MySQL、MongoDB、Kudu,产生过爱恨情仇最多的也就是Kudu。可以对我自己负责任地说,对于以上“工具”的使用,都不成问题,可是如果你要问我,对于这些“工具”的使用,有没有什么骚操作,有没有什么特别巧妙的机制,我好像得说:没有,一个是我理解并执行之后的操作都会非常熟练,会觉得很平淡;二是我可能对于一些具体的细节,是怎么用代码实现的,不太了解。为此,我觉得如果简单会使用,还不够,如果不能读一下他们的源码根本不能理解他们的设计精妙之处。所以,我应该学习一下源码。 一直处于一家公司,身份也从最先的数仓小开发,主写SQL,到数据开发,代码和sql都接触,再到高级开发,平台、开发大小事都接触,再到现在的数据架构师,开始进行一系列的设计(这是公司给我的title,但在我心中,我仍然是一位小开发,哪里需要开发我就去哪里开发开发)。 ## 感想 我一直觉得自己的编码能力还不够,很多时候只能说是看懂代码,在原有的基础上进行小修小补,并不能反过来想为什么要这么去实现,缺少了主人公思维。这种情况,这一年里有所改善,因为开始着手写一些完整独立的大数据应用,也都有了很好的实际效果,于我自己来说也是一个小升级。当然,在大多数场景下,拥有这样的能力已经足够,可以“混”到饭吃了。但我觉得不应该这样,如果不报有深刻探求的精神,那么做得再多,都是动作上的重复和经验上的积累,这些经验也是浅层的、粗泛的,虽然保证能“混”到饭吃已经足够且非常必要,但是停留于此于我来说会让普通的工作劳累化,直至生出厌恶。 我一直羡慕那些能够写出漂亮代码的人,他们的代码足够简洁、足够抽象、足够通用,仿佛站在一个特别的高度在审视问题,戳穿需求的本质,涵盖所有的业务实现且兼容一切的场景,就连未来的动态扩展都考虑好了,犹如在写一部将会运用千年的国家法律。 我也很羡慕那些能够将对应用设计、程序原理阐述得特别清晰的人,他们的博客里长篇大论谈论技术的实现和原理,却条理清晰、逻辑缜密、不带一点儿废话。之前看过一篇介绍Java的ClassLoader的解析文章,内容特别地详实,我不由得在思考,这背后需要怎样的知识背景,以及怎样的耐心,而我一定或多或少缺少这些。 之前也尝试过阅读源码,阅读Spark的源码,Scala的样式真的让我难受,尤其源码那么多的情况下,让我想吐。后来在生产环境使用debezium时,需要自定义converter阅读过debezium的源码,可惜只阅读了一点点,看到一系列的抽象总是容易中途迷失,忘记最开始自己是为了干啥,再到后来运用flink-cdc,它的底层也是基于debezium的,为了了解传入的参数对于运行的影响,看了flink-cdc的源码。后来学习设计模式,每一种设计模式都看,每一种都学,学得很累,因为总想写出运用这些设计模式的代码。直到一天,前同事给我说,“学习设计模式并不是为了让我们写出这样的代码,而是为了看懂别人的代码”,这句话让我醍醐灌顶,就像上学的时候学习二元一次方程,教材里面的例子总是很简单,看了就会了,一上手就麻爪,同样,源码里设计模式的实现也是各种各样,甚至还有变种,前同事的这句话给了我很大的帮助,让我更有劲地去在源码里找设计模式,于是看源码也轻松了一些。 以上是在说一些经历,并不是在说我现在已经很牛逼了,其实不牛逼,直到目前学习的东西都还很少很杂,涉及到的知识面也特别地窄,在今后还得不断拓展和丰富。我打算学习一下Flink的源码,因为它是当下最火的实时计算引擎,是实时数据处理的规范,如果读懂一些里面的实现机制,对于以后的问题定位和应用实现都有一些帮助。 还有一些让我想找一点事情研究的原因就是,一、项目上最近不忙,有些额外的时间让我消费,二、如果不干这些会很无聊,会需要去找对象,可是对象太难找了,碰上另一块拼图太难了,哈哈哈,说来也是特别搞笑。我还是老老实实研究技术,好好工作,在合适的时机之前存够足够的钱,即使某天无法遇到那个人,自己也能过得还不错。 不能等到车子坏了再去打开盖子看着齿轮,了解内部的细节,不仅仅是兴趣,也是为了掌握它,利用它。 今天的想法更新于此,2025年3月7日晚。下次再聊。